package net.yxsoft.kit;


import net.yxsoft.resource.Res;
import rapid.util.FileKit;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipKit {

  public static boolean download(String urlString, String filename, String savePath) {

    try {
      // 构造URL
      URL url = new URL(urlString);
      // 打开连接
      URLConnection con = url.openConnection();
      //设置请求超时为5s
      con.setConnectTimeout(10 * 1000);
      // 输入流
      InputStream is = con.getInputStream();

      // 1K的数据缓冲
      byte[] bs = new byte[1024];
      // 读取到的数据长度
      int len;
      // 输出的文件流
      File sf = new File(savePath);
      if(!sf.exists()) {
        sf.mkdirs();
      }
      OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);
      // 开始读取
      while((len = is.read(bs)) != -1) {
        os.write(bs, 0, len);
      }
      // 完毕，关闭所有链接
      os.close();
      is.close();

      return true;

    } catch(FileNotFoundException e) {
      e.printStackTrace();
    } catch(MalformedURLException e) {
      e.printStackTrace();
    } catch(IOException e) {
      e.printStackTrace();
    }

    return false;
  }

  /**
   * 删除目录（文件夹）以及目录下的文件
   *
   * @param sPath 被删除目录的文件路径
   * @return 目录删除成功返回true，否则返回false
   */
  public static boolean deleteDirectory(String sPath) {
    //如果sPath不以文件分隔符结尾，自动添加文件分隔符
    if(!sPath.endsWith(File.separator)) {
      sPath = sPath + File.separator;
    }
    File dirFile = new File(sPath);
    //如果dir对应的文件不存在，或者不是一个目录，则退出
    if(!dirFile.exists() || !dirFile.isDirectory()) {
      return false;
    }
    boolean flag = true;
    //删除文件夹下的所有文件(包括子目录)
    File[] files = dirFile.listFiles();
    for(int i = 0; i < files.length; i++) {
      //删除子文件
      if(files[i].isFile()) {
        flag = files[i].delete();
        if(!flag) {
          break;
        }
      } //删除子目录
      else {
        flag = deleteDirectory(files[i].getAbsolutePath());
        if(!flag) {
          break;
        }
      }
    }
    if(!flag) {
      return false;
    }
    //删除当前目录
    if(dirFile.delete()) {
      return true;
    } else {
      return false;
    }
  }



  /**
   * 目的地Zip文件
   * 源文件（带压缩的文件或文件夹）
   *
   * @param zipFileName
   * @param sourceFileName
   * @return
   */
  public static boolean zip(String zipFileName, String sourceFileName) {
    //File zipFile = new File(zipFileName);
    System.out.println("压缩中...");

    boolean result = false;

    try {
      File zipFile = new File(zipFileName);
      if(zipFile.exists()) {
        zipFile.delete();
      }
      //创建zip输出流
      ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));

      //创建缓冲输出流
      BufferedOutputStream bos = new BufferedOutputStream(out);

      File sourceFile = new File(sourceFileName);

      //调用函数
      compress(out, bos, sourceFile, sourceFile.getName());

      //compressDir(sourceFile, out, sourceFile.getName());

      bos.close();
      out.close();

      result = true;

    } catch(FileNotFoundException e) {

      e.printStackTrace();
    } catch(IOException e) {

      e.printStackTrace();
    } catch(Exception e) {

      e.printStackTrace();
    }
    System.out.println("压缩完成");

    return result;
  }

  /**
   * 执行压缩
   *
   * @param out
   * @param bos
   * @param sourceFile
   * @param base
   * @throws Exception
   */
  public static void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception {
    //如果路径为目录（文件夹）
    if(sourceFile.isDirectory()) {

      //取出文件夹中的文件（或子文件夹）
      File[] flist = sourceFile.listFiles();

      //如果文件夹为空，则只需在目的地zip文件中写入一个目录进入点
      if(flist.length == 0) {

        System.out.println(base + "/");
        out.putNextEntry(new ZipEntry(base + "/"));
      } else {
        //如果文件夹不为空，则递归调用compress，文件夹中的每一个文件（或文件夹）进行压缩
        for(int i = 0; i < flist.length; i++) {

          compress(out, bos, flist[i], base + "/" + flist[i].getName());
        }
      }
    } else {

      //如果不是目录（文件夹），即为文件，则先写入目录进入点，之后将文件写入zip文件中
      out.putNextEntry(new ZipEntry(base));
      //      FileInputStream fos = new FileInputStream(sourceFile);
      //      BufferedInputStream bis = new BufferedInputStream(fos);

      BufferedInputStream bis = new BufferedInputStream(
        new FileInputStream(sourceFile));
      //
      //      int tag;
      //      System.out.println(base);
      //      //将源文件写入到zip文件中
      //      while((tag = bis.read()) != -1) {
      //        bos.write(tag);
      //      }
      int count;

      byte[] buf = new byte[8192];

      while((count = bis.read(buf)) != -1) {
        out.write(buf, 0, count);
      }

      bis.close();
    }

  }

  public static void main(String[] args) {


  }
}
